home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
gnu
/
nethack.lha
/
nethack-3.1
/
include
/
tradstdc.h
< prev
next >
Wrap
C/C++ Source or Header
|
1993-01-18
|
8KB
|
253 lines
/* SCCS Id: @(#)tradstdc.h 3.1 92/04/01 */
/* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
/* NetHack may be freely redistributed. See license for details. */
#ifndef TRADSTDC_H
#define TRADSTDC_H
#if defined(DUMB) && !defined(NOVOID)
#define NOVOID
#endif
#ifdef NOVOID
#define void int
#endif
#if defined(__STDC__) && !defined(NOTSTDC)
#define NHSTDC
#endif
#if defined(ultrix) && defined(__STDC__) && !defined(__LANGUAGE_C)
/* Ultrix seems to be in a constant state of flux. This check attempts to
* set up ansi compatibility if it wasn't set up correctly by the compiler.
*/
#ifdef mips
#define __mips mips
#endif
#ifdef LANGUAGE_C
#define __LANGUAGE_C LANGUAGE_C
#endif
#endif
/*
* ANSI X3J11 detection.
* Makes substitutes for compatibility with the old C standard.
*/
/* Decide how to handle variable parameter lists:
* USE_STDARG means use the ANSI <stdarg.h> facilities (only ANSI compilers
* should do this, and only if the library supports it).
* USE_VARARGS means use the <varargs.h> facilities. Again, this should only
* be done if the library supports it. ANSI is *not* required for this.
* Otherwise, the kludgy old methods are used.
* The defaults are USE_STDARG for ANSI compilers, and USE_OLDARGS for
* others.
*/
/* #define USE_VARARGS /* use <varargs.h> instead of <stdarg.h> */
/* #define USE_OLDARGS /* don't use any variable argument facilites */
#if defined(apollo) /* Apollos have stdarg(3) but not stdarg.h */
# define USE_VARARGS
#endif
#if defined(NHSTDC) || defined(ULTRIX_PROTO) || defined(MAC)
# if !defined(USE_VARARGS) && !defined(USE_OLDARGS) && !defined(USE_STDARG)
# define USE_STDARG
# endif
#endif
#ifdef NEED_VARARGS /* only define these if necessary */
#ifdef USE_STDARG
# include <stdarg.h>
# define VA_DECL(typ1,var1) (typ1 var1, ...) { va_list the_args;
# define VA_DECL2(typ1,var1,typ2,var2) \
(typ1 var1, typ2 var2, ...) { va_list the_args;
# define VA_INIT(var1,typ1)
# define VA_NEXT(var1,typ1) var1 = va_arg(the_args, typ1)
# define VA_ARGS the_args
# define VA_START(x) va_start(the_args, x)
# define VA_END() va_end(the_args)
# if defined(ULTRIX_PROTO) && !defined(_VA_LIST_)
# define _VA_LIST_ /* prevents multiple def in stdio.h */
# endif
#else
# ifdef USE_VARARGS
# include <varargs.h>
# define VA_DECL(typ1,var1) (va_alist) va_dcl {\
va_list the_args; typ1 var1;
# define VA_DECL2(typ1,var1,typ2,var2) (va_alist) va_dcl {\
va_list the_args; typ1 var1; typ2 var2;
# define VA_ARGS the_args
# define VA_START(x) va_start(the_args)
# define VA_INIT(var1,typ1) var1 = va_arg(the_args, typ1)
# define VA_NEXT(var1,typ1) var1 = va_arg(the_args,typ1)
# define VA_END() va_end(the_args)
# else
# define VA_ARGS arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9
# define VA_DECL(typ1,var1) (var1,VA_ARGS) typ1 var1; \
char *arg1,*arg2,*arg3,*arg4,*arg5,*arg6,*arg7,*arg8,*arg9; {
# define VA_DECL2(typ1,var1,typ2,var2) (var1,var2,VA_ARGS) \
typ1 var1; typ2 var2;\
char *arg1,*arg2,*arg3,*arg4,*arg5,*arg6,*arg7,*arg8,*arg9; {
# define VA_START(x)
# define VA_INIT(var1,typ1)
# define VA_END()
# endif
#endif
#endif /* NEED_VARARGS */
#if defined(NHSTDC) || defined(MSDOS) || defined(MAC) || defined(ULTRIX_PROTO)
/*
* Used for robust ANSI parameter forward declarations:
* int VDECL(sprintf, (char *, const char *, ...));
*
* NDECL() is used for functions with zero arguments;
* FDECL() is used for functions with a fixed number of arguments;
* VDECL() is used for functions with a variable number of arguments.
* Separate macros are needed because ANSI will mix old-style declarations
* with prototypes, except in the case of varargs, and the OVERLAY-specific
* trampoli.* mechanism conflicts with the ANSI <<f(void)>> syntax.
*/
# define NDECL(f) f(void) /* Must be overridden if OVERLAY set later */
# define FDECL(f,p) f p
# if defined(MSDOS) || defined(USE_STDARG)
# define VDECL(f,p) f p
# else
# define VDECL(f,p) f()
# endif
/* generic pointer, always a macro; genericptr_t is usually a typedef */
# define genericptr void *
# if defined(__TURBOC__) || (defined(ULTRIX_PROTO) && !defined(__GNUC__)) || defined(OS2_CSET2)
/* Cover for stupid Turbo C */
/* And Ultrix on a DECstation with 2.0 compiler, which coredumps on
* typedef void * genericptr_t;
* extern void a(void(*)(int, genericptr_t));
* Using the #define is OK for other compiler versions too.
*/
/* And IBM CSet/2. The redeclaration of free hoses the compile. */
# define genericptr_t genericptr
# else
# if !defined(NHSTDC) && !defined(MAC)
# define const
# define signed
# define volatile
# endif
# endif
# if !defined(LATTICE) && !defined(MAC)
/* Lattice can't even PARSE the const below! */
/* MPW can parse but expects an identifier, not a keyword... */
# if defined(ULTRIX_PROTO) && !defined(NHSTDC) && !defined(const)
# define const /* the system header files are *not* __STDC__ */
# endif
# if defined(apollo) && !defined(const)
# define const /* too much trouble with printf(char *format, ...) */
# endif /* instead of printf(const char *format, ...) etc. */
# endif
#else /* NHSTDC */ /* a "traditional" C compiler */
# define NDECL(f) f()
# define FDECL(f,p) f()
# define VDECL(f,p) f()
# if defined(AMIGA) || defined(HPUX) || defined(POSIX_TYPES) || defined(__DECC)
# define genericptr void *
# endif
# ifndef genericptr
# define genericptr char *
# endif
/*
* Traditional C compilers don't have "signed", "const", or "volatile".
*/
# define signed
# define const
# define volatile
#endif /* NHSTDC */
#ifndef genericptr_t
typedef genericptr genericptr_t; /* (void *) or (char *) */
#endif
/*
* According to ANSI, prototypes for old-style declarations must widen the
* arguments to int. However, the MSDOS compilers accept shorter arguments
* (char, short, etc.) in prototypes and do typechecking with them. Therefore
* this mess to allow the better typechecking while also allowing some
* prototypes for the ANSI compilers so people quit trying to fix the
* prototypes to match the standard and thus lose the typechecking.
*/
#if defined(MSDOS) && !defined(__TURBOC__) && !defined(__GO32__)
#define UNWIDENED_PROTOTYPES
#endif
#if defined(AMIGA) && !defined(AZTEC_50)
#define UNWIDENED_PROTOTYPES
#endif
#if defined(MAC) && !defined(THINK_C)
#define UNWIDENED_PROTOTYPES
#endif
#if defined(ULTRIX_PROTO) && defined(ULTRIX_CC20)
#define UNWIDENED_PROTOTYPES
#endif
#if defined(apollo)
#define UNWIDENED_PROTOTYPES
#endif
#ifndef UNWIDENED_PROTOTYPES
# if defined(NHSTDC) || defined(__TURBOC__) || defined(ULTRIX_PROTO) || defined(THINK_C)
# define WIDENED_PROTOTYPES
# endif
#endif
#if defined(sgi) && !defined(__GNUC__)
/*
* As of IRIX 4.0.1, /bin/cc claims to be an ANSI compiler, but it thinks
* it's impossible for a prototype to match an old-style definition with
* unwidened argument types. Thus, we have to turn off all NetHack
* prototypes, and avoid declaring several system functions, since the system
* include files have prototypes and the compiler also complains that
* prototyped and unprototyped declarations don't match.
*/
# undef NDECL
# undef FDECL
# undef VDECL
# define NDECL(f) f()
# define FDECL(f,p) f()
# define VDECL(f,p) f()
#endif
#ifdef __HC__ /* MetaWare High-C defaults to unsigned chars */
# undef signed
#endif
/*
* Allow gcc2 to check parameters of printf-like calls with -Wformat;
* append this to a prototype declaration (see pline() in extern.h).
*/
#ifdef __GNUC__
# if __GNUC__ >= 2
#define PRINTF_F(f,v) __attribute__ ((format (printf, f, v)))
# endif
#endif
#ifndef PRINTF_F
#define PRINTF_F(f,v)
#endif
#endif /* TRADSTDC_H */